/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controladores;

import controladores.exceptions.IllegalOrphanException;
import controladores.exceptions.NonexistentEntityException;
import controladores.exceptions.PreexistingEntityException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import entidades.Proyecto;
import entidades.Comite;
import java.util.ArrayList;
import java.util.List;
import entidades.Carta;
import entidades.Evento;
import entidades.Responsabilidadescomite;
import entidades.Actividades;

/**
 *
 * @author Andres
 */
public class ComiteJpaController {

    public ComiteJpaController() {
        emf = Persistence.createEntityManagerFactory("proyectoCongresoPU");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Comite comite) throws PreexistingEntityException, Exception {
        if (comite.getComiteList() == null) {
            comite.setComiteList(new ArrayList<Comite>());
        }
        if (comite.getCartaList() == null) {
            comite.setCartaList(new ArrayList<Carta>());
        }
        if (comite.getEventoList() == null) {
            comite.setEventoList(new ArrayList<Evento>());
        }
        if (comite.getResponsabilidadescomiteList() == null) {
            comite.setResponsabilidadescomiteList(new ArrayList<Responsabilidadescomite>());
        }
        if (comite.getActividadesList() == null) {
            comite.setActividadesList(new ArrayList<Actividades>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Proyecto proyecto = comite.getProyecto();
            if (proyecto != null) {
                proyecto = em.getReference(proyecto.getClass(), proyecto.getCodigocongreso());
                comite.setProyecto(proyecto);
            }
            Comite comiteRel = comite.getComite();
            if (comiteRel != null) {
                comiteRel = em.getReference(comite.getClass(), comite.getCodigocomite());
                comite.setComite(comiteRel);
            }
            List<Comite> attachedComiteList = new ArrayList<Comite>();
            for (Comite comiteListComiteToAttach : comite.getComiteList()) {
                comiteListComiteToAttach = em.getReference(comiteListComiteToAttach.getClass(), comiteListComiteToAttach.getCodigocomite());
                attachedComiteList.add(comiteListComiteToAttach);
            }
            comite.setComiteList(attachedComiteList);
            List<Carta> attachedCartaList = new ArrayList<Carta>();
            for (Carta cartaListCartaToAttach : comite.getCartaList()) {
                cartaListCartaToAttach = em.getReference(cartaListCartaToAttach.getClass(), cartaListCartaToAttach.getCodradicacion());
                attachedCartaList.add(cartaListCartaToAttach);
            }
            comite.setCartaList(attachedCartaList);
            List<Evento> attachedEventoList = new ArrayList<Evento>();
            for (Evento eventoListEventoToAttach : comite.getEventoList()) {
                eventoListEventoToAttach = em.getReference(eventoListEventoToAttach.getClass(), eventoListEventoToAttach.getCodigo());
                attachedEventoList.add(eventoListEventoToAttach);
            }
            comite.setEventoList(attachedEventoList);
            List<Responsabilidadescomite> attachedResponsabilidadescomiteList = new ArrayList<Responsabilidadescomite>();
            for (Responsabilidadescomite responsabilidadescomiteListResponsabilidadescomiteToAttach : comite.getResponsabilidadescomiteList()) {
                responsabilidadescomiteListResponsabilidadescomiteToAttach = em.getReference(responsabilidadescomiteListResponsabilidadescomiteToAttach.getClass(), responsabilidadescomiteListResponsabilidadescomiteToAttach.getResponsabilidadescomitePK());
                attachedResponsabilidadescomiteList.add(responsabilidadescomiteListResponsabilidadescomiteToAttach);
            }
            comite.setResponsabilidadescomiteList(attachedResponsabilidadescomiteList);
            List<Actividades> attachedActividadesList = new ArrayList<Actividades>();
            for (Actividades actividadesListActividadesToAttach : comite.getActividadesList()) {
                actividadesListActividadesToAttach = em.getReference(actividadesListActividadesToAttach.getClass(), actividadesListActividadesToAttach.getCodigo());
                attachedActividadesList.add(actividadesListActividadesToAttach);
            }
            comite.setActividadesList(attachedActividadesList);
            em.persist(comite);
            if (proyecto != null) {
                proyecto.getComiteList().add(comite);
                proyecto = em.merge(proyecto);
            }
            if (comiteRel != null) {
                comiteRel.getComiteList().add(comite);
                comiteRel = em.merge(comiteRel);
            }
            for (Comite comiteListComite : comite.getComiteList()) {
                Comite oldComiteOfComiteListComite = comiteListComite.getComite();
                comiteListComite.setComite(comite);
                comiteListComite = em.merge(comiteListComite);
                if (oldComiteOfComiteListComite != null) {
                    oldComiteOfComiteListComite.getComiteList().remove(comiteListComite);
                    oldComiteOfComiteListComite = em.merge(oldComiteOfComiteListComite);
                }
            }
            for (Carta cartaListCarta : comite.getCartaList()) {
                Comite oldComiteOfCartaListCarta = cartaListCarta.getComite();
                cartaListCarta.setComite(comite);
                cartaListCarta = em.merge(cartaListCarta);
                if (oldComiteOfCartaListCarta != null) {
                    oldComiteOfCartaListCarta.getCartaList().remove(cartaListCarta);
                    oldComiteOfCartaListCarta = em.merge(oldComiteOfCartaListCarta);
                }
            }
            for (Evento eventoListEvento : comite.getEventoList()) {
                Comite oldComiteOfEventoListEvento = eventoListEvento.getComite();
                eventoListEvento.setComite(comite);
                eventoListEvento = em.merge(eventoListEvento);
                if (oldComiteOfEventoListEvento != null) {
                    oldComiteOfEventoListEvento.getEventoList().remove(eventoListEvento);
                    oldComiteOfEventoListEvento = em.merge(oldComiteOfEventoListEvento);
                }
            }
            for (Responsabilidadescomite responsabilidadescomiteListResponsabilidadescomite : comite.getResponsabilidadescomiteList()) {
                Comite oldComiteOfResponsabilidadescomiteListResponsabilidadescomite = responsabilidadescomiteListResponsabilidadescomite.getComite();
                responsabilidadescomiteListResponsabilidadescomite.setComite(comite);
                responsabilidadescomiteListResponsabilidadescomite = em.merge(responsabilidadescomiteListResponsabilidadescomite);
                if (oldComiteOfResponsabilidadescomiteListResponsabilidadescomite != null) {
                    oldComiteOfResponsabilidadescomiteListResponsabilidadescomite.getResponsabilidadescomiteList().remove(responsabilidadescomiteListResponsabilidadescomite);
                    oldComiteOfResponsabilidadescomiteListResponsabilidadescomite = em.merge(oldComiteOfResponsabilidadescomiteListResponsabilidadescomite);
                }
            }
            for (Actividades actividadesListActividades : comite.getActividadesList()) {
                Comite oldComiteOfActividadesListActividades = actividadesListActividades.getComite();
                actividadesListActividades.setComite(comite);
                actividadesListActividades = em.merge(actividadesListActividades);
                if (oldComiteOfActividadesListActividades != null) {
                    oldComiteOfActividadesListActividades.getActividadesList().remove(actividadesListActividades);
                    oldComiteOfActividadesListActividades = em.merge(oldComiteOfActividadesListActividades);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findComite(comite.getCodigocomite()) != null) {
                throw new PreexistingEntityException("Comite " + comite + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Comite comite) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Comite persistentComite = em.find(Comite.class, comite.getCodigocomite());
            Proyecto proyectoOld = persistentComite.getProyecto();
            Proyecto proyectoNew = comite.getProyecto();
            Comite comiteRelOld = persistentComite.getComite();
            Comite comiteRelNew = comite.getComite();
            List<Comite> comiteListOld = persistentComite.getComiteList();
            List<Comite> comiteListNew = comite.getComiteList();
            List<Carta> cartaListOld = persistentComite.getCartaList();
            List<Carta> cartaListNew = comite.getCartaList();
            List<Evento> eventoListOld = persistentComite.getEventoList();
            List<Evento> eventoListNew = comite.getEventoList();
            List<Responsabilidadescomite> responsabilidadescomiteListOld = persistentComite.getResponsabilidadescomiteList();
            List<Responsabilidadescomite> responsabilidadescomiteListNew = comite.getResponsabilidadescomiteList();
            List<Actividades> actividadesListOld = persistentComite.getActividadesList();
            List<Actividades> actividadesListNew = comite.getActividadesList();
            List<String> illegalOrphanMessages = null;
            for (Carta cartaListOldCarta : cartaListOld) {
                if (!cartaListNew.contains(cartaListOldCarta)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Carta " + cartaListOldCarta + " since its comite field is not nullable.");
                }
            }
            for (Evento eventoListOldEvento : eventoListOld) {
                if (!eventoListNew.contains(eventoListOldEvento)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Evento " + eventoListOldEvento + " since its comite field is not nullable.");
                }
            }
            for (Responsabilidadescomite responsabilidadescomiteListOldResponsabilidadescomite : responsabilidadescomiteListOld) {
                if (!responsabilidadescomiteListNew.contains(responsabilidadescomiteListOldResponsabilidadescomite)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Responsabilidadescomite " + responsabilidadescomiteListOldResponsabilidadescomite + " since its comite field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (proyectoNew != null) {
                proyectoNew = em.getReference(proyectoNew.getClass(), proyectoNew.getCodigocongreso());
                comite.setProyecto(proyectoNew);
            }
            if (comiteRelNew != null) {
                comiteRelNew = em.getReference(comiteRelNew.getClass(), comiteRelNew.getCodigocomite());
                comite.setComite(comiteRelNew);
            }
            List<Comite> attachedComiteListNew = new ArrayList<Comite>();
            for (Comite comiteListNewComiteToAttach : comiteListNew) {
                comiteListNewComiteToAttach = em.getReference(comiteListNewComiteToAttach.getClass(), comiteListNewComiteToAttach.getCodigocomite());
                attachedComiteListNew.add(comiteListNewComiteToAttach);
            }
            comiteListNew = attachedComiteListNew;
            comite.setComiteList(comiteListNew);
            List<Carta> attachedCartaListNew = new ArrayList<Carta>();
            for (Carta cartaListNewCartaToAttach : cartaListNew) {
                cartaListNewCartaToAttach = em.getReference(cartaListNewCartaToAttach.getClass(), cartaListNewCartaToAttach.getCodradicacion());
                attachedCartaListNew.add(cartaListNewCartaToAttach);
            }
            cartaListNew = attachedCartaListNew;
            comite.setCartaList(cartaListNew);
            List<Evento> attachedEventoListNew = new ArrayList<Evento>();
            for (Evento eventoListNewEventoToAttach : eventoListNew) {
                eventoListNewEventoToAttach = em.getReference(eventoListNewEventoToAttach.getClass(), eventoListNewEventoToAttach.getCodigo());
                attachedEventoListNew.add(eventoListNewEventoToAttach);
            }
            eventoListNew = attachedEventoListNew;
            comite.setEventoList(eventoListNew);
            List<Responsabilidadescomite> attachedResponsabilidadescomiteListNew = new ArrayList<Responsabilidadescomite>();
            for (Responsabilidadescomite responsabilidadescomiteListNewResponsabilidadescomiteToAttach : responsabilidadescomiteListNew) {
                responsabilidadescomiteListNewResponsabilidadescomiteToAttach = em.getReference(responsabilidadescomiteListNewResponsabilidadescomiteToAttach.getClass(), responsabilidadescomiteListNewResponsabilidadescomiteToAttach.getResponsabilidadescomitePK());
                attachedResponsabilidadescomiteListNew.add(responsabilidadescomiteListNewResponsabilidadescomiteToAttach);
            }
            responsabilidadescomiteListNew = attachedResponsabilidadescomiteListNew;
            comite.setResponsabilidadescomiteList(responsabilidadescomiteListNew);
            List<Actividades> attachedActividadesListNew = new ArrayList<Actividades>();
            for (Actividades actividadesListNewActividadesToAttach : actividadesListNew) {
                actividadesListNewActividadesToAttach = em.getReference(actividadesListNewActividadesToAttach.getClass(), actividadesListNewActividadesToAttach.getCodigo());
                attachedActividadesListNew.add(actividadesListNewActividadesToAttach);
            }
            actividadesListNew = attachedActividadesListNew;
            comite.setActividadesList(actividadesListNew);
            comite = em.merge(comite);
            if (proyectoOld != null && !proyectoOld.equals(proyectoNew)) {
                proyectoOld.getComiteList().remove(comite);
                proyectoOld = em.merge(proyectoOld);
            }
            if (proyectoNew != null && !proyectoNew.equals(proyectoOld)) {
                proyectoNew.getComiteList().add(comite);
                proyectoNew = em.merge(proyectoNew);
            }
            if (comiteRelOld != null && !comiteRelOld.equals(comiteRelNew)) {
                comiteRelOld.getComiteList().remove(comite);
                comiteRelOld = em.merge(comiteRelOld);
            }
            if (comiteRelNew != null && !comiteRelNew.equals(comiteRelOld)) {
                comiteRelNew.getComiteList().add(comite);
                comiteRelNew = em.merge(comiteRelNew);
            }
            for (Comite comiteListOldComite : comiteListOld) {
                if (!comiteListNew.contains(comiteListOldComite)) {
                    comiteListOldComite.setComite(null);
                    comiteListOldComite = em.merge(comiteListOldComite);
                }
            }
            for (Comite comiteListNewComite : comiteListNew) {
                if (!comiteListOld.contains(comiteListNewComite)) {
                    Comite oldComiteOfComiteListNewComite = comiteListNewComite.getComite();
                    comiteListNewComite.setComite(comite);
                    comiteListNewComite = em.merge(comiteListNewComite);
                    if (oldComiteOfComiteListNewComite != null && !oldComiteOfComiteListNewComite.equals(comite)) {
                        oldComiteOfComiteListNewComite.getComiteList().remove(comiteListNewComite);
                        oldComiteOfComiteListNewComite = em.merge(oldComiteOfComiteListNewComite);
                    }
                }
            }
            for (Carta cartaListNewCarta : cartaListNew) {
                if (!cartaListOld.contains(cartaListNewCarta)) {
                    Comite oldComiteOfCartaListNewCarta = cartaListNewCarta.getComite();
                    cartaListNewCarta.setComite(comite);
                    cartaListNewCarta = em.merge(cartaListNewCarta);
                    if (oldComiteOfCartaListNewCarta != null && !oldComiteOfCartaListNewCarta.equals(comite)) {
                        oldComiteOfCartaListNewCarta.getCartaList().remove(cartaListNewCarta);
                        oldComiteOfCartaListNewCarta = em.merge(oldComiteOfCartaListNewCarta);
                    }
                }
            }
            for (Evento eventoListNewEvento : eventoListNew) {
                if (!eventoListOld.contains(eventoListNewEvento)) {
                    Comite oldComiteOfEventoListNewEvento = eventoListNewEvento.getComite();
                    eventoListNewEvento.setComite(comite);
                    eventoListNewEvento = em.merge(eventoListNewEvento);
                    if (oldComiteOfEventoListNewEvento != null && !oldComiteOfEventoListNewEvento.equals(comite)) {
                        oldComiteOfEventoListNewEvento.getEventoList().remove(eventoListNewEvento);
                        oldComiteOfEventoListNewEvento = em.merge(oldComiteOfEventoListNewEvento);
                    }
                }
            }
            for (Responsabilidadescomite responsabilidadescomiteListNewResponsabilidadescomite : responsabilidadescomiteListNew) {
                if (!responsabilidadescomiteListOld.contains(responsabilidadescomiteListNewResponsabilidadescomite)) {
                    Comite oldComiteOfResponsabilidadescomiteListNewResponsabilidadescomite = responsabilidadescomiteListNewResponsabilidadescomite.getComite();
                    responsabilidadescomiteListNewResponsabilidadescomite.setComite(comite);
                    responsabilidadescomiteListNewResponsabilidadescomite = em.merge(responsabilidadescomiteListNewResponsabilidadescomite);
                    if (oldComiteOfResponsabilidadescomiteListNewResponsabilidadescomite != null && !oldComiteOfResponsabilidadescomiteListNewResponsabilidadescomite.equals(comite)) {
                        oldComiteOfResponsabilidadescomiteListNewResponsabilidadescomite.getResponsabilidadescomiteList().remove(responsabilidadescomiteListNewResponsabilidadescomite);
                        oldComiteOfResponsabilidadescomiteListNewResponsabilidadescomite = em.merge(oldComiteOfResponsabilidadescomiteListNewResponsabilidadescomite);
                    }
                }
            }
            for (Actividades actividadesListOldActividades : actividadesListOld) {
                if (!actividadesListNew.contains(actividadesListOldActividades)) {
                    actividadesListOldActividades.setComite(null);
                    actividadesListOldActividades = em.merge(actividadesListOldActividades);
                }
            }
            for (Actividades actividadesListNewActividades : actividadesListNew) {
                if (!actividadesListOld.contains(actividadesListNewActividades)) {
                    Comite oldComiteOfActividadesListNewActividades = actividadesListNewActividades.getComite();
                    actividadesListNewActividades.setComite(comite);
                    actividadesListNewActividades = em.merge(actividadesListNewActividades);
                    if (oldComiteOfActividadesListNewActividades != null && !oldComiteOfActividadesListNewActividades.equals(comite)) {
                        oldComiteOfActividadesListNewActividades.getActividadesList().remove(actividadesListNewActividades);
                        oldComiteOfActividadesListNewActividades = em.merge(oldComiteOfActividadesListNewActividades);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = comite.getCodigocomite();
                if (findComite(id) == null) {
                    throw new NonexistentEntityException("The comite with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Comite comite;
            try {
                comite = em.getReference(Comite.class, id);
                comite.getCodigocomite();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The comite with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<Carta> cartaListOrphanCheck = comite.getCartaList();
            for (Carta cartaListOrphanCheckCarta : cartaListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Comite (" + comite + ") cannot be destroyed since the Carta " + cartaListOrphanCheckCarta + " in its cartaList field has a non-nullable comite field.");
            }
            List<Evento> eventoListOrphanCheck = comite.getEventoList();
            for (Evento eventoListOrphanCheckEvento : eventoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Comite (" + comite + ") cannot be destroyed since the Evento " + eventoListOrphanCheckEvento + " in its eventoList field has a non-nullable comite field.");
            }
            List<Responsabilidadescomite> responsabilidadescomiteListOrphanCheck = comite.getResponsabilidadescomiteList();
            for (Responsabilidadescomite responsabilidadescomiteListOrphanCheckResponsabilidadescomite : responsabilidadescomiteListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Comite (" + comite + ") cannot be destroyed since the Responsabilidadescomite " + responsabilidadescomiteListOrphanCheckResponsabilidadescomite + " in its responsabilidadescomiteList field has a non-nullable comite field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Proyecto proyecto = comite.getProyecto();
            if (proyecto != null) {
                proyecto.getComiteList().remove(comite);
                proyecto = em.merge(proyecto);
            }
            Comite comiteRel = comite.getComite();
            if (comiteRel != null) {
                comiteRel.getComiteList().remove(comite);
                comiteRel = em.merge(comiteRel);
            }
            List<Comite> comiteList = comite.getComiteList();
            for (Comite comiteListComite : comiteList) {
                comiteListComite.setComite(null);
                comiteListComite = em.merge(comiteListComite);
            }
            List<Actividades> actividadesList = comite.getActividadesList();
            for (Actividades actividadesListActividades : actividadesList) {
                actividadesListActividades.setComite(null);
                actividadesListActividades = em.merge(actividadesListActividades);
            }
            em.remove(comite);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Comite> findComiteEntities() {
        return findComiteEntities(true, -1, -1);
    }

    public List<Comite> findComiteEntities(int maxResults, int firstResult) {
        return findComiteEntities(false, maxResults, firstResult);
    }

    private List<Comite> findComiteEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Comite.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Comite findComite(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Comite.class, id);
        } finally {
            em.close();
        }
    }

    public int getComiteCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Comite> rt = cq.from(Comite.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
